import Vue from 'vue'
import VueRouter from 'vue-router'
// vuex
import store from '@/store'

import * as hooks from './hooks.js'

console.log(hooks);

// 路由子模块自动导入到当前模块中
// 利用了webpack中的api方法来完成对于目录的检索
// require.context() 方法
// 参数1：指定要检索目录路径 相对地址
// 参数2：是否要以指定的目录进行递归检索  一般情况下，不要求递归， true递归，false不是，建议false
// 参数3：指定要检查的文件类型，正则 /\.js$/i  只检索.js扩展名的文件
// 返回值，是一个执行导入的函数
const moduleFn = require.context('./routes', false, /\.js$/i)
// 能使用reduce最好
const routes = moduleFn.keys().reduce((perv, filepath) => {
  let module = moduleFn(filepath).default
  if (Array.isArray(module)) {
    perv.push(...module)
  } else {
    perv.push(module)
  }
  return perv
}, [])

// 修改导航守卫跳转有eslint警告问题
// 解决Vue-Router升级导致的Uncaught(in promise) navigation guard问题
// push
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push (location, onResolve, onReject) {
  if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject)
  return originalPush.call(this, location).catch(err => err)
}
// replace
const originalReplace = VueRouter.prototype.replace
VueRouter.prototype.replace= function replace(location) {
  return originalReplace.call(this, location).catch(err => err)
}

Vue.use(VueRouter)

const router = new VueRouter({
  mode: 'history',
  // 路由规则表
  routes: [
    ...routes,
    {
      path: '*',
      component: () => import('@/views/notfound')
    }
  ]
})


// 批处理前置守卫
Object.keys(hooks).forEach(name => {
  router.beforeEach(hooks[name](store,router))
})

export default router
